﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;

namespace Dandan
{
    class HttpWebResponseUtility
    {
        private static readonly string DefaultUserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)";
        /// <summary>  
        /// 创建GET方式的HTTP请求  
        /// </summary>  
        /// <param name="url">请求的URL</param>  
        /// <param name="timeout">请求的超时时间</param>  
        /// <param name="userAgent">请求的客户端浏览器信息，可以为空</param>  
        /// <param name="cookies">随同HTTP请求发送的Cookie信息，如果不需要身份验证可以为空</param>  
        /// <returns></returns>  
        public static HttpWebResponse CreateGetHttpResponse(string url, int? timeout, string userAgent, CookieCollection cookies)
        {
            if (string.IsNullOrEmpty(url))
            {
                throw new ArgumentNullException("url");
            }
            HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
            request.Method = "GET";
            request.UserAgent = DefaultUserAgent;
            if (LoginData.GetLoginData().data != null)
            {
                request.Headers.Add("Authorization", "Bearer " + LoginData.GetLoginData().data.token);
            }
            if (!string.IsNullOrEmpty(userAgent))
            {
                request.UserAgent = userAgent;
            }
            if (timeout.HasValue)
            {
                request.Timeout = timeout.Value;
            }
            if (cookies != null)
            {
                request.CookieContainer = new CookieContainer();
                request.CookieContainer.Add(cookies);
            }
            return request.GetResponse() as HttpWebResponse;
        }

        public static string HttpGet(string Url, string postDataStr)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url + (postDataStr == "" ? "" : "?") + postDataStr);
            request.Method = "GET";
            request.ContentType = "text/html;charset=UTF-8";

            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            if (LoginData.GetLoginData().data != null)
            {
                request.Headers.Add("Authorization", LoginData.GetLoginData().data.token);
            }
            Stream myResponseStream = response.GetResponseStream();
            StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
            string retString = myStreamReader.ReadToEnd();
            myStreamReader.Close();
            myResponseStream.Close();

            return retString;
        }


        /// <summary>  
        /// 创建POST方式的HTTP请求  
        /// </summary>  
        /// <param name="url">请求的URL</param>  
        /// <param name="parameters">随同请求POST的参数名称及参数值字典</param>  
        /// <param name="timeout">请求的超时时间</param>  
        /// <param name="userAgent">请求的客户端浏览器信息，可以为空</param>  
        /// <param name="requestEncoding">发送HTTP请求时所用的编码</param>  
        /// <param name="cookies">随同HTTP请求发送的Cookie信息，如果不需要身份验证可以为空</param>  
        /// <returns></returns>  
        public static HttpWebResponse CreatePostHttpResponse(string url, IDictionary<string, string> parameters, int? timeout, string userAgent, Encoding requestEncoding, CookieCollection cookies,bool isPost,string body)
        {
            if (string.IsNullOrEmpty(url))
            {
                throw new ArgumentNullException("url");
            }
            if (requestEncoding == null)
            {
                throw new ArgumentNullException("requestEncoding");
            }
            HttpWebRequest request = null;

            //如果是发送HTTPS请求
            if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
            {
                ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
                request = WebRequest.Create(url) as HttpWebRequest;
                request.ProtocolVersion = HttpVersion.Version10;
            }
            else
            {
                request = WebRequest.Create(url) as HttpWebRequest;
            }


            if (LoginData.GetLoginData().data != null)
            {
                request.Headers.Add("Authorization", "Bearer " + LoginData.GetLoginData().data.token);
                
            }
            if (isPost)
            {
                request.Method = "POST";
            }
            else
            {
                request.Method = "GET";
            }
            request.ContentType = "application/x-www-form-urlencoded";
            request.Accept = "application/json";
            if (!string.IsNullOrEmpty(userAgent))
            {
                request.UserAgent = userAgent;
            }
            else
            {
                request.UserAgent = DefaultUserAgent;
            }

            if (timeout.HasValue)
            {
                request.Timeout = timeout.Value;
            }
            if (cookies != null)
            {
                request.CookieContainer = new CookieContainer();
                request.CookieContainer.Add(cookies);
            }
            //如果需要POST数据  
            if (!(parameters == null || parameters.Count == 0))
            {
                StringBuilder buffer = new StringBuilder();
                int i = 0;
                foreach (string key in parameters.Keys)
                {
                    if (i > 0)
                    {
                        buffer.AppendFormat("&{0}={1}", key, parameters[key]);
                    }
                    else
                    {
                        buffer.AppendFormat("{0}={1}", key, parameters[key]);
                    }
                    i++;
                }
                byte[] data = requestEncoding.GetBytes(buffer.ToString());

                byte[] btBodys = Encoding.UTF8.GetBytes(body);
                if (body != "")
                {
                    request.ContentLength = data.Length + btBodys.Length;
                    request.GetRequestStream().Write(btBodys, 0, btBodys.Length);
                }
                
                using (Stream stream = request.GetRequestStream())
                {
                    stream.Write(data, 0, data.Length);
                }
            }
            return request.GetResponse() as HttpWebResponse;
        }
        

        private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
        {
            return true; //总是接受  
        }

        public static string MakeRequestGet(string url)
        {
            Encoding encoding = Encoding.GetEncoding("gb2312");
            try
            {
                HttpWebResponse response = HttpWebResponseUtility.CreatePostHttpResponse("https://tinyboss.cn" + url, null, null, null, encoding, null, false,"");

                using (StreamReader reader = new StreamReader(response.GetResponseStream(), encoding))
                {
                    return reader.ReadToEnd();
                }
            }
            catch (WebException ex)
            {
                using (StreamReader reader = new StreamReader(((HttpWebResponse)ex.Response).GetResponseStream(), encoding))
                {
                    string message = reader.ReadToEnd();
                    System.Windows.Forms.MessageBox.Show(((HttpWebResponse)ex.Response).StatusCode + "====" + message);
                    switch (((HttpWebResponse)ex.Response).StatusCode)
                    {
                        case HttpStatusCode.Continue:
                            break;
                        case HttpStatusCode.SwitchingProtocols:
                            break;
                        case HttpStatusCode.OK:
                            break;
                        case HttpStatusCode.Created:
                            break;
                        case HttpStatusCode.Accepted:
                            break;
                        case HttpStatusCode.NonAuthoritativeInformation:
                            break;
                        case HttpStatusCode.NoContent:
                            break;
                        case HttpStatusCode.ResetContent:
                            break;
                        case HttpStatusCode.PartialContent:
                            break;
                        case HttpStatusCode.MultipleChoices:
                            break;
                        case HttpStatusCode.MovedPermanently:
                            break;
                        case HttpStatusCode.Found:
                            break;
                        case HttpStatusCode.SeeOther:
                            break;
                        case HttpStatusCode.NotModified:
                            break;
                        case HttpStatusCode.UseProxy:
                            break;
                        case HttpStatusCode.Unused:
                            break;
                        case HttpStatusCode.TemporaryRedirect:
                            break;
                        case HttpStatusCode.BadRequest:
                            break;
                        case HttpStatusCode.Unauthorized:
                            message = "用户名或密码错误";
                            break;
                        case HttpStatusCode.PaymentRequired:
                            break;
                        case HttpStatusCode.Forbidden:
                            break;
                        case HttpStatusCode.NotFound:
                            break;
                        case HttpStatusCode.MethodNotAllowed:
                            break;
                        case HttpStatusCode.NotAcceptable:
                            break;
                        case HttpStatusCode.ProxyAuthenticationRequired:
                            break;
                        case HttpStatusCode.RequestTimeout:
                            break;
                        case HttpStatusCode.Conflict:
                            break;
                        case HttpStatusCode.Gone:
                            break;
                        case HttpStatusCode.LengthRequired:
                            break;
                        case HttpStatusCode.PreconditionFailed:
                            break;
                        case HttpStatusCode.RequestEntityTooLarge:
                            break;
                        case HttpStatusCode.RequestUriTooLong:
                            break;
                        case HttpStatusCode.UnsupportedMediaType:
                            break;
                        case HttpStatusCode.RequestedRangeNotSatisfiable:
                            break;
                        case HttpStatusCode.ExpectationFailed:
                            break;
                        case HttpStatusCode.UpgradeRequired:
                            break;
                        case HttpStatusCode.InternalServerError:
                            break;
                        case HttpStatusCode.NotImplemented:
                            break;
                        case HttpStatusCode.BadGateway:
                            break;
                        case HttpStatusCode.ServiceUnavailable:
                            break;
                        case HttpStatusCode.GatewayTimeout:
                            break;
                        case HttpStatusCode.HttpVersionNotSupported:
                            break;
                    }
                    return message;
                }
            }

        }

        public static string MakeRequestPost(string url, IDictionary<string, string> parameters,string body = "")
        {
            Encoding encoding = Encoding.GetEncoding("gb2312");
            try
            {
                HttpWebResponse response = HttpWebResponseUtility.CreatePostHttpResponse("https://tinyboss.cn" + url, parameters, null, null, encoding, null,true,body);

                using (StreamReader reader = new StreamReader(response.GetResponseStream(), encoding))
                {
                    return reader.ReadToEnd();
                }
            }
            catch (WebException ex)
            {
                using (StreamReader reader = new StreamReader(((HttpWebResponse)ex.Response).GetResponseStream(), encoding))
                {
                    string message = reader.ReadToEnd();
                    switch (((HttpWebResponse)ex.Response).StatusCode)
                    {
                        case HttpStatusCode.Continue:
                            break;
                        case HttpStatusCode.SwitchingProtocols:
                            break;
                        case HttpStatusCode.OK:
                            break;
                        case HttpStatusCode.Created:
                            break;
                        case HttpStatusCode.Accepted:
                            break;
                        case HttpStatusCode.NonAuthoritativeInformation:
                            break;
                        case HttpStatusCode.NoContent:
                            break;
                        case HttpStatusCode.ResetContent:
                            break;
                        case HttpStatusCode.PartialContent:
                            break;
                        case HttpStatusCode.MultipleChoices:
                            break;
                        case HttpStatusCode.MovedPermanently:
                            break;
                        case HttpStatusCode.Found:
                            break;
                        case HttpStatusCode.SeeOther:
                            break;
                        case HttpStatusCode.NotModified:
                            break;
                        case HttpStatusCode.UseProxy:
                            break;
                        case HttpStatusCode.Unused:
                            break;
                        case HttpStatusCode.TemporaryRedirect:
                            break;
                        case HttpStatusCode.BadRequest:
                            break;
                        case HttpStatusCode.Unauthorized:
                            message = "用户名或密码错误";
                            break;
                        case HttpStatusCode.PaymentRequired:
                            break;
                        case HttpStatusCode.Forbidden:
                            break;
                        case HttpStatusCode.NotFound:
                            break;
                        case HttpStatusCode.MethodNotAllowed:
                            break;
                        case HttpStatusCode.NotAcceptable:
                            break;
                        case HttpStatusCode.ProxyAuthenticationRequired:
                            break;
                        case HttpStatusCode.RequestTimeout:
                            break;
                        case HttpStatusCode.Conflict:
                            break;
                        case HttpStatusCode.Gone:
                            break;
                        case HttpStatusCode.LengthRequired:
                            break;
                        case HttpStatusCode.PreconditionFailed:
                            break;
                        case HttpStatusCode.RequestEntityTooLarge:
                            break;
                        case HttpStatusCode.RequestUriTooLong:
                            break;
                        case HttpStatusCode.UnsupportedMediaType:
                            break;
                        case HttpStatusCode.RequestedRangeNotSatisfiable:
                            break;
                        case HttpStatusCode.ExpectationFailed:
                            break;
                        case HttpStatusCode.UpgradeRequired:
                            break;
                        case HttpStatusCode.InternalServerError:
                            break;
                        case HttpStatusCode.NotImplemented:
                            break;
                        case HttpStatusCode.BadGateway:
                            break;
                        case HttpStatusCode.ServiceUnavailable:
                            break;
                        case HttpStatusCode.GatewayTimeout:
                            break;
                        case HttpStatusCode.HttpVersionNotSupported:
                            break;
                    }
                    return message;
                }
            }

        }
    }
}